Leak and correctness fixes on NMEA reader. Passed NMEA serial (with valgrind)
authorrobertl <robertl>
Wed, 8 Nov 2006 02:47:56 +0000 (02:47 +0000)
committerrobertl <robertl>
Wed, 8 Nov 2006 02:47:56 +0000 (02:47 +0000)
, testo and leaktest.

nmea.c

diff --git a/nmea.c b/nmea.c
index 7d946e57adec4b184452a38705ddd69994c50d19..152c6c3eb327c8ea00dd2f3f20e6e49732fe2f89 100644 (file)
--- a/nmea.c
+++ b/nmea.c
@@ -315,7 +315,7 @@ gpgll_parse(char *ibuf)
        double latdeg, lngdeg;
        char lngdir, latdir;
        int hms;
-       char valid;
+       char valid = 0;
        waypoint *waypt;
 
        if (trk_head == NULL) {
@@ -349,6 +349,9 @@ gpgll_parse(char *ibuf)
        if (lngdir == 'W') lngdeg = -lngdeg;
        waypt->longitude = ddmm2degrees(lngdeg);
 
+       if (curr_waypt && (read_mode == rm_serial)) {
+               waypt_free(curr_waypt);
+       }
        curr_waypt = waypt;
 }
 
@@ -359,8 +362,8 @@ gpgga_parse(char *ibuf)
        char lngdir, latdir;
        double hms;
        double alt;
-       int fix;
-       int nsats;
+       int fix = fix_unknown;
+       int nsats = 0;
        double hdop;
        char altunits;
        waypoint *waypt;
@@ -423,6 +426,9 @@ gpgga_parse(char *ibuf)
                        break;
        }
 
+       if (curr_waypt && (read_mode == rm_serial)) {
+               waypt_free(curr_waypt);
+       }
        curr_waypt = waypt;
 }
 
@@ -494,6 +500,9 @@ gprmc_parse(char *ibuf)
        if (lngdir == 'W') lngdeg = -lngdeg;
        waypt->longitude = ddmm2degrees(lngdeg);
 
+       if (curr_waypt && (read_mode == rm_serial)) {
+               waypt_free(curr_waypt);
+       }
        curr_waypt = waypt;
 }
 
@@ -855,8 +864,12 @@ nmea_rd_posn(posn_status *posn_status)
                nmea_parse_one_line(ibuf);
                if (lt != last_read_time) {
                        if (last_read_time) {
+                               waypoint *w = curr_waypt;
+
                                lt = last_read_time;
-                               return waypt_dupe(curr_waypt);
+                               curr_waypt = NULL;
+
+                               return w;
                        }
                }
        }